/**
 * Javascript Countdown
 * Copyright (c) 2009 Markus Hedlund
 * Version 1.1
 * Licensed under MIT license
 * http://www.opensource.org/licenses/mit-license.php
 * http://labs.mimmin.com/countdown
 */

var remaining = {
    /**
     * Get the difference of the passed date, and now. The different formats of the taget parameter are:
     * January 12, 2009 15:14:00     (Month dd, yyyy hh:mm:ss)
     * January 12, 2009              (Month dd, yyyy)
     * 09,00,12,15,14,00             (yy,mm,dd,hh,mm,ss) Months range from 0-11, not 1-12.
     * 09,00,12                      (yy,mm,dd)          Months range from 0-11, not 1-12.
     * 500                           (milliseconds)
     * 2009-01-12 15:14:00           (yyyy-mm-dd hh-mm-ss)
     * 2009-01-12 15:14              (yyyy-mm-dd hh-mm)
     * @param target Target date. Can be either a date object or a string (formated like '24 December, 2010 15:00:00')
     * @return Difference in seconds
     */
    getSeconds: function(target) {
        var today  = new Date();

        if (typeof(target) == 'object') {
            var targetDate = target;
        } else {
            var matches = target.match(/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})(:(\d{2}))?/);   // YYYY-MM-DD HH-MM-SS
            if (matches != null) {
                matches[7] = typeof(matches[7]) == 'undefined' ? '00' : matches[7];
                var targetDate = new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[7]);
            } else {
                var targetDate = new Date(target);
            }
        }

        return Math.floor((targetDate.getTime() - today.getTime()) / 1000);
    },

    /**
     * @param seconds Difference in seconds
     * @param i18n A language object (see code)
     * @param onlyLargestUnit Return only the largest unit (see documentation)
     * @param hideEmpty Hide empty units (see documentation)
     * @return String formated something like '1 week, 1 hours, 1 second'
     */
    getString: function(seconds, i18n, onlyLargestUnit, hideEmpty) {
        if (seconds < 1) {
            return '';
        }

        if (typeof(hideEmpty) == 'undefined' || hideEmpty == null) {
            hideEmpty = true;
        }
        if (typeof(onlyLargestUnit) == 'undefined' || onlyLargestUnit == null) {
            onlyLargestUnit = false;
        }
        if (typeof(i18n) == 'undefined' || i18n == null) {
            i18n = {
                weeks: ['week', 'weeks'],
                days: ['day', 'days'],
                hours: ['hour', 'hours'],
                minutes: ['minute', 'minutes'],
                seconds: ['second', 'seconds']
            };
        }

        var units = {
            days: 24*60*60,
            hours: 60*60,
            minutes: 60,
            seconds: 1
        };

        var returnArray = [];
        var value;
        for (unit in units) {
            value = units[unit];
            if (seconds / value >= 1 || unit == 'seconds' || !hideEmpty) {
                secondsConverted = Math.floor(seconds / value);
                var i18nUnit = i18n[unit][secondsConverted == 1 ? 0 : 1];
                returnArray.push(secondsConverted + ' ' + i18nUnit);
                seconds -= secondsConverted * value;

                if (onlyLargestUnit) {
                    break;
                }
            }
        };

        return returnArray.join(', ');
    },

    /**
     * @param seconds Difference in seconds
     * @return String formated something like '169:00:01'
     */
    getStringDigital: function(seconds) {
        if (seconds < 1) {
            return '';
        }

        remainingTime = remaining.getArray(seconds);

        for (index in remainingTime) {
            remainingTime[index] = remaining.padNumber(remainingTime[index]);
        };

        return remainingTime.join(':');
    },

    /**
     * @param seconds Difference in seconds
     * @return Array with hours, minutes and seconds
     */
    getArray: function(seconds) {
        if (seconds < 1) {
            return [];
        }

        var units = [60*60, 60, 1];

        var returnArray = [];
        var value;
        for (index in units) {
            value = units[index];
            secondsConverted = Math.floor(seconds / value);
            returnArray.push(secondsConverted);
            seconds -= secondsConverted * value;
        };

        return returnArray;
    },

    /**
     * @param number An integer
     * @return Integer padded with a 0 if necessary
     */
    padNumber: function(number) {
        return (number >= 0 && number < 10) ? '0' + number : number;
    }
};